class Solution {
    // 去掉空格
    void replace(string &s)
    {
        int pos = s.find(" ");
        while(pos != -1)
        {
            s.replace(pos, 1, "");
            pos = s.find(" ");
        }
    }
public:
    int calculate(string s) {
        // ' '     跳过
        // '+'/'-' 更新 op
        // '('     将当前运算结果和符号入栈，重新初始化 op 和 curSum
        // ')'     取出栈顶的运算结果和符号，跟当前运算结果(curSum)运算
        // 数字    依次连续取出(存在"123"这种情况)，并做运算
        stack<int> st;  // [num, op]
        int op = 1, curSum = 0;
        // replace(s);
        int n = s.size(), i = 0;
        cout << s << endl;
        while(i < n)
        {
            char ch = s[i];
            if(ch == ' ')
            {
                i++;
            }
            if(ch == '+' || ch == '-')
            {
                op = ch == '+' ? 1 : -1;
                i++;
            }
            else if(ch == '(')
            {
                st.push(curSum);
                st.push(op);
                curSum = 0, op = 1;
                i++;
            }
            else if(ch == ')')
            {
                int preOp = st.top(); st.pop();
                int preSum = st.top(); st.pop();
                curSum = preOp * curSum + preSum;
                i++;
            }
            else
            {
                // 数字
                int num = 0;
                while(i < n && (s[i] >= '0' && s[i] <= '9'))
                {
                    num = num * 10 + (s[i] - '0');
                    i++;
                }
                curSum = curSum + num * op;
            }
        }
        return curSum;
    }
};